{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "EMNIST CNN Classification",
      "provenance": [],
      "toc_visible": true,
      "authorship_tag": "ABX9TyNQEZHej6cE2bqkBgy4hPZB",
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/wandb/awesome-dl-projects/blob/master/ml-tutorial/EMNIST_CNN_Classification.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LHCCGutqrj-r",
        "colab_type": "text"
      },
      "source": [
        "# Imports and Setups"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "qiFYfrVpXbAP",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 386
        },
        "outputId": "674957bd-380d-46cb-922a-664c4e77d44c"
      },
      "source": [
        "!nvidia-smi"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Tue Sep  8 02:27:42 2020       \n",
            "+-----------------------------------------------------------------------------+\n",
            "| NVIDIA-SMI 450.66       Driver Version: 418.67       CUDA Version: 10.1     |\n",
            "|-------------------------------+----------------------+----------------------+\n",
            "| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |\n",
            "| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |\n",
            "|                               |                      |               MIG M. |\n",
            "|===============================+======================+======================|\n",
            "|   0  Tesla P4            Off  | 00000000:00:04.0 Off |                    0 |\n",
            "| N/A   41C    P8     7W /  75W |      0MiB /  7611MiB |      0%      Default |\n",
            "|                               |                      |                 ERR! |\n",
            "+-------------------------------+----------------------+----------------------+\n",
            "                                                                               \n",
            "+-----------------------------------------------------------------------------+\n",
            "| Processes:                                                                  |\n",
            "|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |\n",
            "|        ID   ID                                                   Usage      |\n",
            "|=============================================================================|\n",
            "|  No running processes found                                                 |\n",
            "+-----------------------------------------------------------------------------+\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "WwZMe8Ey0LYE",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 92
        },
        "outputId": "d459119f-13bc-42fe-9276-7be4090479ef"
      },
      "source": [
        "import tensorflow as tf\n",
        "print(tf.__version__)\n",
        "\n",
        "from tensorflow.keras.layers import *\n",
        "from tensorflow.keras.models import *\n",
        "import tensorflow_datasets as tfds\n",
        "\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "%matplotlib inline\n",
        "tfds.disable_progress_bar()\n",
        "\n",
        "from tqdm import tqdm\n",
        "import seaborn as sns\n",
        "from sklearn.metrics import confusion_matrix\n",
        "from sklearn.preprocessing import normalize\n",
        "from sklearn.utils import class_weight"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "2.3.0\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n",
            "  import pandas.util.testing as tm\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "HqUfAaLR7H4F",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "%%capture\n",
        "!pip install wandb"
      ],
      "execution_count": 3,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3GeVDMnA7LOr",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 71
        },
        "outputId": "74602683-c8bd-4105-a69d-4b0bd4c1deba"
      },
      "source": [
        "import wandb\n",
        "from wandb.keras import WandbCallback\n",
        "\n",
        "wandb.login()"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "\n",
              "        window._wandbApiKey = new Promise((resolve, reject) => {\n",
              "            function loadScript(url) {\n",
              "            return new Promise(function(resolve, reject) {\n",
              "                let newScript = document.createElement(\"script\");\n",
              "                newScript.onerror = reject;\n",
              "                newScript.onload = resolve;\n",
              "                document.body.appendChild(newScript);\n",
              "                newScript.src = url;\n",
              "            });\n",
              "            }\n",
              "            loadScript(\"https://cdn.jsdelivr.net/npm/postmate/build/postmate.min.js\").then(() => {\n",
              "            const iframe = document.createElement('iframe')\n",
              "            iframe.style.cssText = \"width:0;height:0;border:none\"\n",
              "            document.body.appendChild(iframe)\n",
              "            const handshake = new Postmate({\n",
              "                container: iframe,\n",
              "                url: 'https://app.wandb.ai/authorize'\n",
              "            });\n",
              "            const timeout = setTimeout(() => reject(\"Couldn't auto authenticate\"), 5000)\n",
              "            handshake.then(function(child) {\n",
              "                child.on('authorize', data => {\n",
              "                    clearTimeout(timeout)\n",
              "                    resolve(data)\n",
              "                });\n",
              "            });\n",
              "            })\n",
              "        });\n",
              "    "
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "\u001b[34m\u001b[1mwandb\u001b[0m: Appending key for api.wandb.ai to your netrc file: /root/.netrc\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "True"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 4
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "M_C6x2qUrnSu",
        "colab_type": "text"
      },
      "source": [
        "# Download EMNIST and Minor Investigation\n",
        "\n",
        "Check out this [colab notebook]() for:\n",
        "* More on `EMNIST/bymerge` dataset\n",
        "* Class distribution\n",
        "\n",
        "Check out [this paper](https://arxiv.org/abs/1702.05373) for more on EMNIST."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "T7KbDzcP0iXX",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 148
        },
        "outputId": "d6851f13-d109-43c9-ac54-6e6b4fcfa7e8"
      },
      "source": [
        "# Gather EMNIST/bymerge dataset\n",
        "train_ds, validation_ds = tfds.load(\n",
        "    \"emnist/bymerge\",\n",
        "    split=[\"train[:85%]\", \"train[85%:]\"],\n",
        "    as_supervised=True\n",
        ")"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "\u001b[1mDownloading and preparing dataset emnist/bymerge/3.0.0 (download: 535.73 MiB, generated: Unknown size, total: 535.73 MiB) to /root/tensorflow_datasets/emnist/bymerge/3.0.0...\u001b[0m\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/urllib3/connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings\n",
            "  InsecureRequestWarning)\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "Shuffling and writing examples to /root/tensorflow_datasets/emnist/bymerge/3.0.0.incomplete0L5Z0Z/emnist-train.tfrecord\n",
            "Shuffling and writing examples to /root/tensorflow_datasets/emnist/bymerge/3.0.0.incomplete0L5Z0Z/emnist-test.tfrecord\n",
            "\u001b[1mDataset emnist downloaded and prepared to /root/tensorflow_datasets/emnist/bymerge/3.0.0. Subsequent calls will reuse this data.\u001b[0m\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QfFWriVto6G3",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        },
        "outputId": "c5e23a58-9009-40fe-a9d2-48ad59b49be0"
      },
      "source": [
        "LABELS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', \n",
        "          'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n",
        "          'a', 'b', 'd', 'e', 'f', 'g', 'h', 'n', 'q', 'r', 't']\n",
        "\n",
        "print(len(LABELS))"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "47\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6BNpPDFAruNE",
        "colab_type": "text"
      },
      "source": [
        "# Simple `tf.data` dataloader"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "kFzES4Xa2DTA",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "AUTO = tf.data.experimental.AUTOTUNE\n",
        "BATCH_SIZE = 256\n",
        "\n",
        "## We are transposing to rotate the image by 90 deg clockwise making the images human friendly.\n",
        "def transpose_and_flatten(image, label):\n",
        "  image = tf.image.convert_image_dtype(image, dtype=tf.float32) # scale image pixels to [0,1]\n",
        "  image = tf.transpose(image, [1,0,2]) # transpose to get human friendly image, since rotation\n",
        "\n",
        "  label = tf.one_hot(label, depth=len(LABELS)) # one hot encode label\n",
        "\n",
        "  return image, label\n",
        "\n",
        "trainloader = (\n",
        "    train_ds\n",
        "    .shuffle(1024)\n",
        "    .map(transpose_and_flatten, num_parallel_calls=AUTO)\n",
        "    .batch(BATCH_SIZE)\n",
        "    .prefetch(AUTO)\n",
        ")\n",
        "\n",
        "testloader = (\n",
        "    validation_ds\n",
        "    .map(transpose_and_flatten, num_parallel_calls=AUTO)\n",
        "    .batch(BATCH_SIZE)\n",
        "    .prefetch(AUTO)\n",
        ")"
      ],
      "execution_count": 7,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "0Il96w-6sCk9",
        "colab_type": "text"
      },
      "source": [
        "#### Quick Visualization\n",
        "(Run the cell below multiple times to visualize different images.)"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "0ekU0Gj3kU4c",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 591
        },
        "outputId": "d6629ced-007b-4abf-aa73-aa6a9d90d18f"
      },
      "source": [
        "imgs, labels = next(iter(trainloader))\n",
        "\n",
        "plt.figure(figsize=(10, 10))\n",
        "for n in range(25):\n",
        "    ax = plt.subplot(5, 5, n+1)\n",
        "    plt.imshow(tf.reshape(imgs[n], shape=(28,28)), cmap='gray')\n",
        "    plt.title(LABELS[np.argmax(labels[n])])\n",
        "    plt.axis('off')"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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EiV1ckRERCRKUaWr+DUPoWmjxtLH17BOnToZ2z377LMWazVV4VWvXt3igw46yOJw48eWLVta3LFjR4uzpa64ovlnn33mHRszZozFW7dutZhX11U1++67r8WcauA/B/xqxXy/AH4KYd68eRU+J6Wo8qtGjRre63bt2ln85JNPesd4s+KGDRta3K9fP68dX+ef/exnFp999tleO96Ile/7bNq0aWPxeeed5x278MILLeaUGQAMHDjQ4oquBtNIjoiIiERJnRwRERGJkjo5IiIiEqWSnpOTDc8P4BgA5s+fX8lnIxXVvHlziw8++OCM7ZYsWVIZpxO1cJ5MtuXfnKfv1auXxeE1OvTQQy3u0KFDxp/HuATAjBkzvGPTp0+3eNmyZRbz/JyqpkmTJhY3a9YsYzuek/P44497x8KlvJI+nk/DS/IB/16qWbOmd4znMfJctaOPPtprx2UDuLxAWCbgiy++KDMuL97VHvCXpPPcIsAvWfCvf/3L4lzub43kiIiISJTUyREREZEolXS6qnbt2hlff/nll2XG8v3yvZlbPlx55ZUWh8OyX331lcW8BFbKj5emhkv0a9WqVWY7AGjatKnFffr0sThMEfNmqZziylbegYem+e8A/iaTmzZtsjisuFuVljDze8QbZYbvMS//5TQw4Fea5dRvuDRfVeMLi5/B11xzjcVt27b12oXPQpapnEL4TF+8eLHFnMocPny4127atGkWc7o4G/533HHHHd6xSy65xOKwzMHNN99s8eTJky3OpayBRnJEREQkSurkiIiISJTUyREREZEolfScnDAfya95+anm5Hw/Xsp7xRVXWPzCCy947SpziS7vLs673obmzJlj8dKlSwt6TqWM30/A33rhxz/+scXHHHOM1453Nw53HOb5HQceeKDFnIsH/PkBPEcknC/Cn0M+Xy5RDwCnnXaaxTyPZNGiRV671atXW7xx40bvWKkvNw/fO56Tw+8Jz6kC/Ov0xBNPeMd4Tsarr75qcbhkeOzYsRbz9inhPBA+j1yWHVcV4b15zjnnWHzPPfdYHL6//OwLywbst99+FvNclnvvvddr99JLL1nMc9ryPe/qJz/5ifd66NChFv/oRz/yjp1xxhkWX3755Rb/7ne/2+Pfq5EcERERiZI6OSIiIhKlkk5XhcNpPNTGFVe7dOniteOh1qq8azHjapQPP/yw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iIiISJRKIl3Fu6by8tOwQm7Hjh0t5pRUONTaokULixs3bmxxOGQ4dOhQi5UGKTxOYwB+ioJLB7Rr185rx1Vzb7vtNovDXW+lOPCSWK5WDQBXXXWVxeeff77F48eP99pNnjzZYl3n/OGUf5MmTSzu3r27165atWoWq6pxxfFSawCYP39+me3CqReF/C7iawwAZ5xxhsV8b4bPY74fH3roIYs//fRTr11lTQHRSI6IiIhESZ0cERERiVJJpKt4FRXPyObUFQDMnDnT4i5duljMm3oCwOGHH24xV27s1KmT146HDGfNmmWxVloVRvi+vncA2gkAACAASURBVPvuuxYfeuihFrdq1cpr161bN4s5Fak0RvFbv36995qH7fmaH3vssV47HvrWdS4MTl3VqlUrxTORbxV6qgSvqDviiCO8Yz/60Y8s7ty5s8VhlevXXnutzDit702N5IiIiEiU1MkRERGRKKmTIyIiIlEqiTk5nIfcsmWLxa+++qrXjvN/zz33nMXhnJxHH320zGOnn366147nfkydOtXicKk5n5PkLszt8nvO1yKseNysWTOLTz75ZIt52T+gpa7FKJyTM2PGDIt5Tk5YLoKv7WeffWaxdicvjL320v8Px4qXivM8nEceecRr9x//8R8W79ixw+Kwavk999xjcbhrehr0yRUREZEoqZMjIiIiUSqJdFUm4dA0v862rJTTTVzVs2HDhl47ToO0bt3aYq7ADPhL3DVcnj+8+RyXC+CUFACcddZZFh988MEW83JIQOmqYsQb7gLAggULymwXlg3g15xK0f0nkl1YNZm/937wgx9YHE7z4GkjXMpl1KhRXrulS5eW+XfSopEcERERiZI6OSIiIhKloklX8RBaPoa4ODURzvB+4YUXyvw7vOkYADRo0MBi3vxz+vTpXrt169ZZrOHy/OEKmYsWLbKYV10BQI8ePSzmFXLPPPOM1y5cbSXFjZ8J4Sa7devWrezTkQy4SvWGDRtSPBNhfP/ss88+FnPFf8Df4Lhnz54Wh1WueRUVp6jC1VW8AW8x0EiOiIiIREmdHBEREYmSOjkiIiISpUqdk8M5wnB5b82aNS0Oc3q8RDsXXJ0RAObMmWMxV1g9++yzvXa8Cy/HXCES2H1JnuQfz9MKrydr06aNxaeddpp37OOPP7ZYy8mLA5dwAPzyALw0fOPGjV47zf1I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eG1Dv0//+uuvhr6domMlBwAAJImXHAAAkCRecgAAQJKoycmiXbt2FldVVVn84IMPRuPmzZtn8QsvvFD8G2skNHd8//33W3zKKadE42bPnm1xTU1N0e8rRU2aNLG4Q4cO0bWTT87ta0Jro3755Zfo2tGjR4/7a1C6GlsdR2q0pvGqq66KrvXq1cviWbNmWbxnz55oXLnOVVZyAABAknjJAQAASSJdJfyy/Jw5cyzu27evxX7pdtGiRcW9sUYqU7qqc+fOGX/NlClTLC7X5dWG0rRpU4tHjBhh8SOPPBKNa9GiRU4/78CBAxZ//vnn0bV9+/ZZfPDgQYsXL16ccZzGe/fujcbxbIuva9euFvfu3Tu61qlTJ4u//PJLi7dv3x6N02eYKWWJ4qusrLR49OjR0bUrrrjC4vPPP99in/rXubp7926LfWpa26j8/fff+d1wAbGSAwAAksRLDgAASBLpKuE76Z511lkWa3W6X8b74osvinpfjZU+D91Rddppp0XjzjzzzAa7p3Lm06yDBw+2eMKECRb36NEjGufnRS4uuuii6POxY/+cWZhtF5Yuda9bt87i5cuXR+M+++wzi3/88UeLdRnd/744Pn3W55xzjsWDBg2Kxl144YUWt2/f3mJNXYUQwpo1ayzetWtXwe4TdXP33XdbrPM+hBCaNWtmsZYF+PSizlWdZz41rWmthQsXWnz48OE63nVhsJIDAACSxEsOAABIEi85AAAgSdTkiC5dukSfM21VfuONN6LPWh+AwtGaKI19nUUpbFMsB74m55JLLrFYtwv7uha/fTuTTM8rhLimTeurunXrlvHnnXfeeRYPGTIkurZt2zaLlyxZYvHkyZOjcRs3brRY631wfPqcWrZsGV0799xzLdaaDk/rOKjJaVj6/O666y6Lsz0v/W49cuRIdE3/fdR5e9lll0XjHnjgAYtnzpxp8bhx46JxDfX3gZUcAACQJF5yAABAkkhXiWHDhkWfdauybnvVTsgoHJ9O6d+/v8WtWrWyWLcMhxDCggULLKYTbu70z6q6utriF198MRqn24L9YYyahtKD/vwWct1yrEvdZ5xxRjRO01yaIvFtA7p3726xdt+9+OKLo3FPPPGExXqQbgikOWuj6YotW7ZYvHXr1mic/tlpusI/p99++81iTR0yT4tP549PNyp95vqMXnvttWjcwIEDLdZDPv0c1k7qOk5T4iGQrgIAAKgXXnIAAECSGn26SlMkVVVVGcdpimTDhg1FvafGyqerNMWh15o3bx6N06r/lStXWkw6IruffvrJ4jFjxlj81VdfReNy3ZX07bffWjx37tzomqahdHdHkyZNonGa8rryyistHjlyZDROU176M/xBkrqDTNOaIfD343g0NenTlPpnpwcb+9SFHu6aT+ds5M7PJd2RqOl+T3dTPv/88xbPmjUrGvfee+9ZrGko/Z4OIYTbbrvN4g4dOlg8dOjQaJx+VxcTKzkAACBJvOQAAIAk8ZIDAACS1OhrcnTLY9++faNrus3x3Xfftfj3338v/o01QtqhM4T4dHHN5/ttqpWVlbWOQ8zXoKxatcpirc/JtzOw/nz/e+3cubPW2NO6nk8++cRiv4VZt4Znq/vwdV7I3b59+yxev359dE0/63Z+X5OjJ5lrLd2vv/4ajeO0+Prr2bNn9Fnr7LTVg6f1pto9XLf/hxBCTU2Nxdpe4PTTT4/G6ZwbPXq0xbfccks07umnn7a4mC0F+AYAAABJ4iUHAAAkqazTVbp10dNla+2IGkK81W78+PEWa9ojhHjJ/dRTT7XYHyqoS+lHjx49zl0jk/bt20eftcOmLmdv2rQpGvfpp59a7Le64h8+hbRu3TqLs6ULdPk5W/onnyVnv4zeunVriwcMGGDxoEGDonE+ZYnC07Sl706bqVut/07WFJVe82lF0lX50VThhAkTomt9+vSp9df478+nnnrK4s2bN+f0++r3rC/f2L9/f62/xnc81i7M2VLY9cVKDgAASBIvOQAAIEm85AAAgCQVvSZHc/iaf/d1Mpqv9W2i9URj3aJ48803Z/y9VOfOnaPPulU517qe++67z+J77rknGvfzzz9bPGPGjOjaxIkTLc53a25j4Z+FPmvNAS9cuDAap9uOkbtMdRC+TkZbuOvJ8CGEcPDgQYt1y7duNw0hbiuv9W3+tPI77rjDYq3J0Vqd2u7x/w4fPhx9zlQfgONr06aNxZdffnl0TU8e13nrj1zROkc9zmPv3r3ROI7YyI3/jhw2bJjF1113XXRN54jWy82ePTsa9/HHH1tczJpGPdolhLj1AzU5AAAAdcRLDgAASFJB0lWa1vHbsC+99FKL9URgn2rS1IRf1tKtZsovWee61KZpLb13v2Q6b948i1evXm2xLruGEP+/6PJhCCFMnTrVYt+1FTFdvgwhTivqs9FOrCGwbb8QdB74FgkPPfSQxTfeeGN0TZ+LpnFXrFgRjdNu4prS8HNb01rZurTqXNdtr2+99VY0Tpfmi9lVNUX6PezbO+i1bF3GM6VE2TKeH3/SuJZi+GtK08eLFy+OrtW3g7/vVO+7Xp9orOQAAIAk8ZIDAACSVJB0VceOHS3WSu0Q4l1Uuvzsq+v1wDZ/eJseGlZdXW2x3zkxf/58i3U521ekv/zyyxZfffXVFq9duzYad+edd1rsDytTjz32WMZrLJFnp89GOxyHEC+Ra4rq66+/jsaxM6P+9DBUTU+FEML1119vcbYlcd0p1bt37+hattRTJprS8Lsv9Dth2rRpFvudd9nmLf5NU/laeqCddUOIUxI6/3S3XQjx4Y+HDh2ymHRV7nTODR8+PLqmn/2/c/pcnnnmGYv9HKnv96dPZeq/qXpPfg77soNiYSUHAAAkiZccAACQJF5yAABAkgpSk6Nbo/v16xdd89uC/8/n47QOx+drNWeYT/7Qn1isuWatmRk1alQ0Ltd8PnU3+dMtxP7vjuait2zZYrGenh0CNTmFoN24t21UOLYTAAAIFUlEQVTbFl3T7ad+Lmk+3m8lzUW206i15m7SpEnRuOnTp1u8Y8cOizmFvn60Jkc7z/saK91CrvPP11Nq/ZxeY87mrkOHDhY//PDD0TXf7kHpXFi2bJnFvit4ffk6Pa3vU9nqcIuJlRwAAJAkXnIAAECSCn5Ap98mVsyDt3J10003RZ+7dOli8e7duy3WzqloGPostCN2CPHS+fLlyy3es2dP8W+skdEl7FdffTW69s4771js0896eKcuU/uup3p44Nlnn21x27Zto3GavtLUmB7WGUIIq1atsljTVSgcnX/+8ONsXY6Vph/ZNp4fPZxWD00NIX4OPlWrLVUK/W9bu3btLPYtVLp27WqxlnLMnTs3GtdQnepZyQEAAEniJQcAACSp4OmqUqGdFv1ymnZf1e7HpZBaawz02Wh3TN1FEEK8/PrSSy9ZrClGFJ5PB2ZLD65Zs6bW/+53WunBmZqWHDNmTDTuggsusFh3bQwZMiQap7tzdCn++++/j8aRIkG5007wvruw8vNUdyDq7sl8aWpM56OfmzpvNV114MCBet9DPljJAQAASeIlBwAAJImXHAAAkKRka3I0f+g7MOrWtRkzZjTYPeHf9Nn4Og6tp8jWERv1p1uE/fbgbF2EM3X79v997dq1Fm/cuNHi1atXR+PGjh1r8ciRIy32nZZvuOEGi7WT6rhx46Jxu3btynjvQKnSuhZt0+C7CyvfQbi6urqg96QnBYwfP95i3wZC6Xf1iepyzUoOAABIEi85AAAgScmmq7STbufOnaNretijxkBj0rRpU4sHDx5ssZ8vM2fOtDjfbtO6bK3bWTWNFUIITz75ZK2//vbbb48+673rwa56cGQIpKtQnrSdxqBBgyz2naeVHmgbQv23jWtX4xBCuPfeey3u3r27xdm6X2u7Dz2stSGxkgMAAJLESw4AAEhSUukq7WTct29fi31Fuu7oKEQnSKAc+KVuTVFNmjTJYp+SWrBgQcZr9eV3ym3atMniKVOmWFxVVRWN69atm8XZlvCBcqRd4bPtqNKDdf0BmNu3b6/z79u8eXOLR40aFV3Tz9lSVDU1NRZPnTrV4iVLltT5fgqBbwcAAJAkXnIAAECSeMkBAABJSqomR7eNP/rooxb7nP3SpUstPlFdGIGG5ueBngauc2fRokXRON9JtZh0a3ivXr0s1loBAP+jLVDefvvt6JrWm2pXYp3rIYQwdOhQi0eMGGFxz549o3GZaoOOHDkSfX799dctfu655yzWkwYaEis5AAAgSbzkAACAJJVdukoPcezYsWN0TZe69eBHf1jg/Pnzi3R3QPnQ9JW2X7j22mujccOHD7fYzx09HDPbwam65VS3x2pn1xDiwwgff/xxi1u3bp3xZ5NyLhz9fm3WrJnF+sxCiJ8nB+aeOPq8unbtGl3TFK+Wb2h7lRDif0f139BsNBX2wQcfRNd0q3i2w30bCis5AAAgSbzkAACAJJVduqqystLi999/P7qmn7WCXJfUQyh811agHGVK82g34RBCePbZZy3WnRghxIfuZUsbaWpM0yADBw6MxumSu6aofIdVXQavrq62eN++fRnvAf/m/1x1B02bNm0s9mkM0lUNJ9ufb6dOnSx+5ZVXMo7Tfw81NZ2vjRs3WjxhwoToms7HUkgls5IDAACSxEsOAABIEi85AAAgSWVXk6N69OgRfR47dqzFWgPgT2fdvXt3cW8MKEE+P7569WqL161bZ7HvdKq1GcOGDYuu+RqduvJbkzPxW1F/+OEHi6dPn24x9XZ14+s99FTrHTt2WHzw4MFoXMuWLS3WTra+OzY1UvnRPzetKW3Xrl00TreQ+1q6TLKdIJ6t/ufQoUMWayfjDRs2RONKYdu4YiUHAAAkiZccAACQpLJOV/llN01RaZdj3QIbQmlsa8Px6TK471qNuvN/7z/66COLN2/ebPHgwYOjcf369bNYD/UMIe5YrNuP/WGgudKlbk0raxfVEEKYNm2axR9++GGtvx51p/Ns69atFtfU1GQcp6ksTYGGEMJ3331nMd+7udu5c6fF2q144sSJ0TifvlKZtvn7lFSmObdgwYJo3OTJky1eu3Ztxp9XaljJAQAASeIlBwAAJImXHAAAkKSyrsnxuUCt4VixYoXF69evb7B7Qt1onl6fXwghfPPNNxZv3769we6psdCThDXH7ufLm2++abG2hw8hhGuuucZird3p3bt3NC5TjY6v09CW8DNnzrTY1+Ro7QB1OIWjtTZa9+SP0NGt/5nqc0II4cCBAxZTk5MfrY2pqqqKrt16660W67b+EOKaHP1u3bZtWzRu5cqVFmebc1onVOp1OIqVHAAAkCRecgAAQJIqsi07VVRUlNyalHZfXbp0aXRNO3Tqtrtly5YV/8YK6NixY5lbUtZDqTxPTV0MGDDA4v79+0fjNIUyZ86c4t9YkRTjeZbKs9S0hS6Xt2jRIq+fp51etXtxqaSkUp+bSudpri0BfEqq1FNU5TA3Ne3Utm3b6Jqmr/r06RNd02e2f/9+ixctWhSN27Jli8WlOOdylelZspIDAACSxEsOAABIUtmlq1Tr1q2jz3qAmB40V25YEv8fXeou9WXvbMphSRy5aUxzszEo97mZT0ox1e7xpKsAAECjwksOAABIEi85AAAgSWVdk5Mq8v5pKfe8P/7B3EwLczMd1OQAAIBGhZccAACQpKzpKgAAgHLFSg4AAEgSLzkAACBJvOQAAIAk8ZIDAACSxEsOAABIEi85AAAgSf8FugqUsPC//gMAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 720x720 with 25 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dunhN6lbmjjy",
        "colab_type": "text"
      },
      "source": [
        "# Simple classifier"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YMkuvJKTm9dx",
        "colab_type": "text"
      },
      "source": [
        "#### Build Model"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "d5l1tnXhmmxH",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def CNNModel():\n",
        "  inputs = Input(shape=(28,28,1))\n",
        "  x = Conv2D(32, (3,3), activation='relu')(inputs)\n",
        "  x = MaxPooling2D(pool_size=2)(x)\n",
        "  x = Conv2D(64, (3,3), activation='relu')(x)\n",
        "  x = MaxPooling2D(pool_size=2)(x)\n",
        "  x = Conv2D(64, (3,3), activation='relu')(x)\n",
        "  x = MaxPooling2D(pool_size=2)(x)\n",
        "  x = Flatten()(x)\n",
        "  outputs = Dense(len(LABELS), activation='softmax')(x)\n",
        "\n",
        "  return Model(inputs=inputs, outputs=outputs)"
      ],
      "execution_count": 9,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xwR4wZ99SPcP",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 497
        },
        "outputId": "8d858acf-e23e-4788-aabc-8e1229f5aa88"
      },
      "source": [
        "tf.keras.backend.clear_session()\n",
        "model = CNNModel()\n",
        "model.summary()"
      ],
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"functional_1\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "input_1 (InputLayer)         [(None, 28, 28, 1)]       0         \n",
            "_________________________________________________________________\n",
            "conv2d (Conv2D)              (None, 26, 26, 32)        320       \n",
            "_________________________________________________________________\n",
            "max_pooling2d (MaxPooling2D) (None, 13, 13, 32)        0         \n",
            "_________________________________________________________________\n",
            "conv2d_1 (Conv2D)            (None, 11, 11, 64)        18496     \n",
            "_________________________________________________________________\n",
            "max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64)          0         \n",
            "_________________________________________________________________\n",
            "conv2d_2 (Conv2D)            (None, 3, 3, 64)          36928     \n",
            "_________________________________________________________________\n",
            "max_pooling2d_2 (MaxPooling2 (None, 1, 1, 64)          0         \n",
            "_________________________________________________________________\n",
            "flatten (Flatten)            (None, 64)                0         \n",
            "_________________________________________________________________\n",
            "dense (Dense)                (None, 47)                3055      \n",
            "=================================================================\n",
            "Total params: 58,799\n",
            "Trainable params: 58,799\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JxGdeZ_t6guC",
        "colab_type": "text"
      },
      "source": [
        "#### Callback"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JcglLPpt6jCk",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "early_stopper = tf.keras.callbacks.EarlyStopping(\n",
        "    monitor='val_loss', patience=5, verbose=0, mode='auto', restore_best_weights=True\n",
        ")"
      ],
      "execution_count": 11,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ScKH6S3HUhcu",
        "colab_type": "text"
      },
      "source": [
        "#### Train"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "-TvNaKBGNdyc",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "val_images, val_labels = next(iter(testloader))"
      ],
      "execution_count": 12,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "GSpEIbopSVQm",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 846
        },
        "outputId": "b31cb34d-2bcc-4aaf-823a-696ef33b5f80"
      },
      "source": [
        "# initialize wandb run\n",
        "wandb.init(entity='iit-bhu', project='emnist')\n",
        "\n",
        "# hyperparameters\n",
        "config = wandb.config\n",
        "config.epochs = 70\n",
        "config.learning_rate = 0.001\n",
        "\n",
        "# model\n",
        "tf.keras.backend.clear_session()\n",
        "model = CNNModel()\n",
        "\n",
        "# optimizer\n",
        "optimizer = tf.keras.optimizers.Adam(learning_rate=config.learning_rate)\n",
        "\n",
        "# compile\n",
        "model.compile(optimizer, 'categorical_crossentropy', metrics=['acc'])\n",
        "\n",
        "# train\n",
        "model.fit(trainloader,\n",
        "          epochs=config.epochs,\n",
        "          validation_data=testloader,\n",
        "          callbacks=[WandbCallback(monitor='val_loss',\n",
        "                                   save_model=True,\n",
        "                                   data_type='image', \n",
        "                                   training_data=(val_images, val_labels), \n",
        "                                   labels=LABELS),\n",
        "                     early_stopper])"
      ],
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/html": [
              "\n",
              "                Logging results to <a href=\"https://wandb.com\" target=\"_blank\">Weights & Biases</a> <a href=\"https://docs.wandb.com/integrations/jupyter.html\" target=\"_blank\">(Documentation)</a>.<br/>\n",
              "                Project page: <a href=\"https://app.wandb.ai/iit-bhu/emnist\" target=\"_blank\">https://app.wandb.ai/iit-bhu/emnist</a><br/>\n",
              "                Run page: <a href=\"https://app.wandb.ai/iit-bhu/emnist/runs/3v0n2k5a\" target=\"_blank\">https://app.wandb.ai/iit-bhu/emnist/runs/3v0n2k5a</a><br/>\n",
              "            "
            ],
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/70\n",
            "2318/2318 [==============================] - 124s 54ms/step - loss: 0.7336 - acc: 0.7717 - val_loss: 0.4797 - val_acc: 0.8386\n",
            "Epoch 2/70\n",
            "2318/2318 [==============================] - 129s 56ms/step - loss: 0.4390 - acc: 0.8501 - val_loss: 0.4245 - val_acc: 0.8514\n",
            "Epoch 3/70\n",
            "2318/2318 [==============================] - 165s 71ms/step - loss: 0.3921 - acc: 0.8638 - val_loss: 0.3868 - val_acc: 0.8636\n",
            "Epoch 4/70\n",
            "2318/2318 [==============================] - 160s 69ms/step - loss: 0.3667 - acc: 0.8716 - val_loss: 0.3674 - val_acc: 0.8702\n",
            "Epoch 5/70\n",
            "2318/2318 [==============================] - 161s 69ms/step - loss: 0.3513 - acc: 0.8760 - val_loss: 0.3643 - val_acc: 0.8705\n",
            "Epoch 6/70\n",
            "2318/2318 [==============================] - 161s 69ms/step - loss: 0.3394 - acc: 0.8799 - val_loss: 0.3557 - val_acc: 0.8733\n",
            "Epoch 7/70\n",
            "2318/2318 [==============================] - 131s 57ms/step - loss: 0.3307 - acc: 0.8822 - val_loss: 0.3540 - val_acc: 0.8716\n",
            "Epoch 8/70\n",
            "2318/2318 [==============================] - 158s 68ms/step - loss: 0.3236 - acc: 0.8844 - val_loss: 0.3486 - val_acc: 0.8773\n",
            "Epoch 9/70\n",
            "2318/2318 [==============================] - 128s 55ms/step - loss: 0.3176 - acc: 0.8860 - val_loss: 0.3440 - val_acc: 0.8770\n",
            "Epoch 10/70\n",
            "2318/2318 [==============================] - 155s 67ms/step - loss: 0.3125 - acc: 0.8873 - val_loss: 0.3456 - val_acc: 0.8763\n",
            "Epoch 11/70\n",
            "2318/2318 [==============================] - 156s 67ms/step - loss: 0.3087 - acc: 0.8886 - val_loss: 0.3436 - val_acc: 0.8775\n",
            "Epoch 12/70\n",
            "2318/2318 [==============================] - 157s 68ms/step - loss: 0.3047 - acc: 0.8894 - val_loss: 0.3400 - val_acc: 0.8788\n",
            "Epoch 13/70\n",
            "2318/2318 [==============================] - 157s 68ms/step - loss: 0.3013 - acc: 0.8906 - val_loss: 0.3448 - val_acc: 0.8764\n",
            "Epoch 14/70\n",
            "2318/2318 [==============================] - 157s 68ms/step - loss: 0.2984 - acc: 0.8914 - val_loss: 0.3417 - val_acc: 0.8785\n",
            "Epoch 15/70\n",
            "2318/2318 [==============================] - 158s 68ms/step - loss: 0.2959 - acc: 0.8920 - val_loss: 0.3379 - val_acc: 0.8800\n",
            "Epoch 16/70\n",
            "2318/2318 [==============================] - 153s 66ms/step - loss: 0.2931 - acc: 0.8931 - val_loss: 0.3408 - val_acc: 0.8783\n",
            "Epoch 17/70\n",
            "2318/2318 [==============================] - 158s 68ms/step - loss: 0.2907 - acc: 0.8937 - val_loss: 0.3384 - val_acc: 0.8799\n",
            "Epoch 18/70\n",
            "2318/2318 [==============================] - 157s 68ms/step - loss: 0.2885 - acc: 0.8942 - val_loss: 0.3381 - val_acc: 0.8808\n",
            "Epoch 19/70\n",
            "2318/2318 [==============================] - 158s 68ms/step - loss: 0.2866 - acc: 0.8946 - val_loss: 0.3384 - val_acc: 0.8810\n",
            "Epoch 20/70\n",
            "2318/2318 [==============================] - 158s 68ms/step - loss: 0.2848 - acc: 0.8954 - val_loss: 0.3423 - val_acc: 0.8804\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<tensorflow.python.keras.callbacks.History at 0x7f4c40f65e48>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 13
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "5qbue1HNkX4-",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def plot_confusion_matrix():\n",
        "  y_test = []\n",
        "  y_preds = []\n",
        "  for imgs, labels in tqdm(testloader):\n",
        "      y_test.extend(np.argmax(labels, axis=1))\n",
        "      y_pred = model.predict(imgs)\n",
        "      y_preds.extend(np.argmax(y_pred, axis=1))\n",
        "\n",
        "  cm = confusion_matrix(y_true = y_test, y_pred = y_preds)\n",
        "  cm_normalize = normalize(cm, axis=1)\n",
        "\n",
        "  plt.figure(figsize=(15,15));\n",
        "  sns.heatmap(cm_normalize, annot=False, xticklabels=LABELS, yticklabels=LABELS, linewidths=.1);\n",
        "\n",
        "  plt.savefig('confusion_matrix.png', bbox_inches='tight')"
      ],
      "execution_count": 1,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "wx6kPmjXv6F6",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 881
        },
        "outputId": "96b3361a-1173-4463-fab7-a091ce88c452"
      },
      "source": [
        "plot_confusion_matrix()"
      ],
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "409it [00:29, 13.98it/s]\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 1080x1080 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "h3bHsUre0YMD",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "wandb.log({\"image_confusion_matrix\": [wandb.Image('confusion_matrix.png')]})"
      ],
      "execution_count": 16,
      "outputs": []
    }
  ]
}